//package com.learn.test;
//
//import org.I0Itec.zkclient.IZkDataListener;
//import org.I0Itec.zkclient.ZkClient;
//import org.I0Itec.zkclient.exception.ZkNodeExistsException;
//
//import java.util.concurrent.CountDownLatch;
//
///**
// * @author shenkaiwen5
// * @version 1.0
// * @date 2021-05-18
// */
//public class ZkTest2 implements Runnable {
//
//    private static String IP_PORT = "127.0.0.1:2181";
//    private static String Z_NODE = "/node";
//    private static int INVENTORY = 1;
//    private static final int NUM = 10;
//
//    private CountDownLatch cdl = new CountDownLatch(1);
//    private static ZkClient zkClient = new ZkClient(IP_PORT);
//
//    public static void main(String[] args) {
//        for (int i = 0; i < 10; i++) {
//            new Thread(new ZkTest2()).start();
//        }
//        zkClient.delete(Z_NODE);
//    }
//
//    @Override
//    public void run() {
//        ZkTest2 zk = new ZkTest2();
//        zk.lock();
//        try {
//            if (INVENTORY > 0) {
//                System.out.println(Thread.currentThread().getName() + "扣减库存-1");
//                INVENTORY--;
//            }
//            System.out.println(Thread.currentThread().getName() + "获得库存：" + INVENTORY);
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {
//            zk.unlock();
//        }
//    }
//
//    public void lock() {
//        if (tryLock()) {
//            return;
//        }
//        waitForLock();
//
//        lock();
//    }
//
//
//    private boolean tryLock() {
//        try {
//            zkClient.createPersistent(Z_NODE);
//            System.out.println(Thread.currentThread().getName() + "获取锁成功");
//            return true;
//        } catch (ZkNodeExistsException e) {
//            return false;
//        }
//    }
//
//    private void waitForLock() {
//        System.out.println(Thread.currentThread().getName() + "获取锁失败");
//        IZkDataListener listener = new IZkDataListener() {
//            @Override
//            public void handleDataChange(String s, Object o) throws Exception {
//
//            }
//
//            @Override
//            public void handleDataDeleted(String s) throws Exception {
//                // 这个写法也不对，这里都不是原子操作；
//                // 本来都在x-cdl下await
//                // 后来线程a新建了y-cdl，释放了x-cdl，线程b在y-cdl下await
//                // 线程c新建了z-cdl,释放了x-cdl，那么线程b阻塞
////                CountDownLatch oldCdl = cdl;
////                cdl = new CountDownLatch(1);
////                System.out.println("唤醒");
////                oldCdl.countDown();
//                cdl.countDown();
//            }
//        };
//        // 监听
//        zkClient.subscribeDataChanges(Z_NODE, listener);
//
//        if (zkClient.exists(Z_NODE)) {
//            try {
//                cdl.await();
//                cdl = new CountDownLatch(1);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        }
//
//        // 释放监听
//        zkClient.unsubscribeDataChanges(Z_NODE, listener);
//    }
//
//    public void unlock() {
//        zkClient.delete(Z_NODE);
//    }
//}
